
package tp.pr5.mv.window;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;

import tp.pr5.mv.CPU;
import tp.pr5.mv.Controller;
import tp.pr5.mv.Instruction;
import tp.pr5.mv.Memory;
import tp.pr5.mv.OperandStack;
import tp.pr5.mv.ProgramCounter;
import tp.pr5.mv.ProgramMV;


@SuppressWarnings("serial")
public class Botonera extends javax.swing.JPanel implements CPU.Observer {

	/* Panel con los tres botones que permiten ejecutar los comandos run, step y stop. Los 3 JButton
	 * poseen 3 clases anónimas que implementan el funcionamiento de los botones al ser pulsados
	 * */
	private JButton step;
	private JButton run;
	private JButton stop;
	private JButton pause;
	
	public Botonera( Controller controller ) {
		
		super(new FlowLayout());
		setBorder(BorderFactory.createTitledBorder("Acciones") );
		init(controller);
	}
	
	void init(final Controller controller) {
		// El final únicamente no permite cambiar las referencias.
		
		
		java.net.URL stepIcon = TPMVWindow.class.getResource("icons/step.png"); 
		step = new JButton();
		step.setIcon( new ImageIcon(stepIcon) ); // Añadimos la imagen del boton step
		step.addActionListener( new ActionListener() { // Implementacion del boton step

			@Override
			public void actionPerformed(ActionEvent e) { // Llamamos al controlador para que ejecute el step
				controller.requestStep(); 
			}
			
		});
		add(step);
		
		java.net.URL runIcon = TPMVWindow.class.getResource("icons/run.png"); // A
		run = new JButton();
		run.setIcon( new ImageIcon(runIcon) ); // Añadimos la imagen del botón run
		run.addActionListener( new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) { // Llamamos al controlador para que ejecute el run
				controller.requestRun();
			}
			
		});
		add(run);
		
		java.net.URL pauseIcon = TPMVWindow.class.getResource("icons/pause.png");
		pause = new JButton();
		pause.setIcon( new ImageIcon(pauseIcon) );
		pause.addActionListener( new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
				controller.requestPause();
			}
			
		});
		add(pause); 
		pause.setEnabled(false);
		
		java.net.URL stopIcon = TPMVWindow.class.getResource("icons/exit.png");
		stop = new JButton();
		stop.setIcon( new ImageIcon(stopIcon) ); // Añadimos el icono al boton stop
		stop.addActionListener( new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) { // Mostramos un cuadro de dialogo y si el usuario acepta salimos de la aplicacion
				
				 int op = JOptionPane.showConfirmDialog(null, "Do you want to close this application?", "Exit", JOptionPane.YES_NO_OPTION);
			     if ( op == JOptionPane.OK_OPTION )
						System.exit(0);
			   
			}
			
		});
		add(stop);
				
		
	}

	@Override
	public void onStartInstrExecution(Instruction ins) {}

	@Override
	public void onEndInstrExecution(Instruction instr, Memory mem,
			OperandStack stack, ProgramCounter pc) {}

	@Override
	public void onHalt() {}

	@Override
	public void onReset(ProgramMV program) {}

	@Override
	public void onStartRun() { // Cuando comienza a ejecutarse el comando RUN se desactivan todos los botones
		step.setEnabled(false);
		run.setEnabled(false);
		stop.setEnabled(false);
		pause.setEnabled(true);
	}

	@Override
	public void onEndRun(boolean aborted) {
		step.setEnabled(true);
		run.setEnabled(true);
		stop.setEnabled(true);
		pause.setEnabled(false);
	}

	@Override
	public void onTrap(Instruction instr, String trapMessage) {}

	
}
